FALSE Registered S3 methods overwritten by 'dbplyr':
FALSE   method         from
FALSE   print.tbl_lazy     
FALSE   print.tbl_sql      
FALSE -- Attaching packages --------------------------------------------------------------------------------------------- tidyverse 1.3.1 --
FALSE √ ggplot2 3.3.5     √ purrr   0.3.4
FALSE √ tibble  3.1.6     √ dplyr   1.0.8
FALSE √ tidyr   1.2.0     √ stringr 1.4.0
FALSE √ readr   2.1.2     √ forcats 0.5.1
FALSE -- Conflicts ------------------------------------------------------------------------------------------------ tidyverse_conflicts() --
FALSE x dplyr::filter() masks stats::filter()
FALSE x dplyr::lag()    masks stats::lag()
FALSE 
FALSE Attaching package: ‘scales’
FALSE 
FALSE The following object is masked from ‘package:purrr’:
FALSE 
FALSE     discard
FALSE 
FALSE The following object is masked from ‘package:readr’:
FALSE 
FALSE     col_factor
FALSE 
FALSE Registered S3 method overwritten by 'data.table':
FALSE   method           from
FALSE   print.data.table     
FALSE Registered S3 methods overwritten by 'htmltools':
FALSE   method               from         
FALSE   print.html           tools:rstudio
FALSE   print.shiny.tag      tools:rstudio
FALSE   print.shiny.tag.list tools:rstudio
FALSE Registered S3 method overwritten by 'htmlwidgets':
FALSE   method           from         
FALSE   print.htmlwidget tools:rstudio
FALSE 
FALSE Attaching package: ‘plotly’
FALSE 
FALSE The following object is masked from ‘package:ggplot2’:
FALSE 
FALSE     last_plot
FALSE 
FALSE The following object is masked from ‘package:stats’:
FALSE 
FALSE     filter
FALSE 
FALSE The following object is masked from ‘package:graphics’:
FALSE 
FALSE     layout
FALSE 
FALSE data.table 1.14.2 using 8 threads (see ?getDTthreads).  Latest news: r-datatable.com
FALSE 
FALSE Attaching package: ‘data.table’
FALSE 
FALSE The following objects are masked from ‘package:dplyr’:
FALSE 
FALSE     between, first, last
FALSE 
FALSE The following object is masked from ‘package:purrr’:
FALSE 
FALSE     transpose
FALSE 
FALSE 
FALSE Attaching package: ‘lubridate’
FALSE 
FALSE The following objects are masked from ‘package:data.table’:
FALSE 
FALSE     hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year
FALSE 
FALSE The following objects are masked from ‘package:base’:
FALSE 
FALSE     date, intersect, setdiff, union
FALSE 
FALSE Loading required package: kableExtra
FALSE 
FALSE Attaching package: ‘kableExtra’
FALSE 
FALSE The following object is masked from ‘package:dplyr’:
FALSE 
FALSE     group_rows
FALSE 
FALSE 
FALSE Attaching package: ‘timetk’
FALSE 
FALSE The following object is masked from ‘package:data.table’:
FALSE 
FALSE     :=
FALSE 
FALSE Loading required package: svd
FALSE Loading required package: forecast
FALSE Registered S3 method overwritten by 'quantmod':
FALSE   method            from
FALSE   as.zoo.data.frame zoo 
FALSE 
FALSE Attaching package: ‘Rssa’
FALSE 
FALSE The following object is masked from ‘package:stats’:
FALSE 
FALSE     decompose
FALSE 
FALSE 
FALSE     ‘tseries’ version: 0.10-50
FALSE 
FALSE     ‘tseries’ is a package for time series analysis and computational finance.
FALSE 
FALSE     See ‘library(help="tseries")’ for details.
FALSE 
FALSE 
FALSE Attaching package: ‘tsibble’
FALSE 
FALSE The following object is masked from ‘package:lubridate’:
FALSE 
FALSE     interval
FALSE 
FALSE The following object is masked from ‘package:data.table’:
FALSE 
FALSE     key
FALSE 
FALSE The following objects are masked from ‘package:base’:
FALSE 
FALSE     intersect, setdiff, union
Warning: `funs()` was deprecated in dplyr 0.8.0.
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
Warning: Removed 404 row(s) containing missing values (geom_path).

Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 7 row(s) containing missing values (geom_path).

Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 206 row(s) containing missing values (geom_path).

Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 45 row(s) containing missing values (geom_path).

Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
[1] "sf"         "data.frame"

Rows: 161,025
Columns: 3
$ date               <date> 2020-02-29, 2020-03-01, 2020-03-02, 2020-03-03, 2020-03-04, 2020-03-05, 2020-03-06, 2020-03-07, 2020-03-~
$ location           <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", ~
$ new_cases_smoothed <dbl> 0.714, 0.714, 0.000, 0.000, 0.000, 0.000, 0.000, 0.429, 0.429, 0.429, 0.429, 0.857, 0.857, 0.857, 0.857, ~

$upper
'dendrogram' with 2 branches and 2 members total, at height 19342438 

$lower
$lower[[1]]
'dendrogram' with 2 branches and 200 members total, at height 5689823 

$lower[[2]]
'dendrogram' with 2 branches and 16 members total, at height 6715621 
Rows: 216
Columns: 2
$ Var1 <fct> Afghanistan, Albania, Algeria, Andorra, Angola, Anguilla, Antigua and Barbuda, Argentina, Armenia, Aruba, Australia, Au~
$ Freq <int> 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1,~
Rows: 161,025
Columns: 4
$ date               <date> 2020-02-29, 2020-03-01, 2020-03-02, 2020-03-03, 2020-03-04, 2020-03-05, 2020-03-06, 2020-03-07, 2020-03-~
$ location           <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", ~
$ new_cases_smoothed <dbl> 0.714, 0.714, 0.000, 0.000, 0.000, 0.000, 0.000, 0.429, 0.429, 0.429, 0.429, 0.857, 0.857, 0.857, 0.857, ~
$ cluster            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ~

  1   2   3   4   5 
168  14  32   1   1 
Warning: Width not defined. Set with `position_dodge(width = ?)`

`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

`geom_smooth()` using method = 'loess' and formula 'y ~ x'

`geom_smooth()` using method = 'loess' and formula 'y ~ x'

`geom_smooth()` using method = 'loess' and formula 'y ~ x'

ARIMA modeling

Series: clean[, c("new_cases_smoothed")] 
ARIMA(3,1,4) 

Coefficients:
          ar1     ar2     ar3     ma1      ma2      ma3     ma4
      -0.4299  0.6920  0.5389  0.6332  -0.5678  -0.2774  0.4349
s.e.   0.0467  0.0282  0.0424  0.0478   0.0491   0.0442  0.0353

sigma^2 = 45309290:  log likelihood = -8236.15
AIC=16488.3   AICc=16488.48   BIC=16525.83
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21"
[10] "2022-04-22" "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30"
[19] "2022-05-01" "2022-05-02" "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09"
[28] "2022-05-10" "2022-05-11" "2022-05-12"

Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 7 row(s) containing missing values (geom_path).

Series: clean[, c("new_cases_smoothed")] 
ARIMA(3,1,3) 

Coefficients:
         ar1      ar2     ar3      ma1     ma2      ma3
      1.7425  -1.4068  0.6000  -1.8457  1.6693  -0.5555
s.e.  0.0513   0.0688  0.0364   0.0522  0.0704   0.0472

sigma^2 = 248194:  log likelihood = -5888.63
AIC=11791.26   AICc=11791.4   BIC=11823.8
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21" "2022-04-22"
[11] "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30" "2022-05-01" "2022-05-02"
[21] "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09" "2022-05-10" "2022-05-11" "2022-05-12"

Series: clean[, c("new_cases_smoothed")] 
ARIMA(2,1,2) 

Coefficients:
         ar1      ar2      ma1     ma2
      1.9166  -0.9274  -0.9965  0.1666
s.e.  0.0227   0.0219   0.0410  0.0377

sigma^2 = 857173:  log likelihood = -6582.95
AIC=13175.89   AICc=13175.97   BIC=13199.3
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21" "2022-04-22"
[11] "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30" "2022-05-01" "2022-05-02"
[21] "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09" "2022-05-10" "2022-05-11" "2022-05-12"

Series: clean[, c("new_cases_smoothed")] 
ARIMA(5,1,5) 

Coefficients:
          ar1     ar2     ar3      ar4      ar5     ma1      ma2      ma3     ma4     ma5
      -0.0568  1.2160  0.8464  -0.4059  -0.6316  0.0872  -1.0399  -0.6285  0.4546  0.1877
s.e.   0.0561  0.0405  0.0790   0.0363   0.0503  0.0664   0.0486   0.0854  0.0491  0.0620

sigma^2 = 11453351:  log likelihood = -7499.34
AIC=15020.67   AICc=15021.01   BIC=15072.01
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21"
[10] "2022-04-22" "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30"
[19] "2022-05-01" "2022-05-02" "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09"
[28] "2022-05-10" "2022-05-11" "2022-05-12"

Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 5 row(s) containing missing values (geom_path).

Series: clean[, c("new_cases_smoothed")] 
ARIMA(5,1,3) 

Coefficients:
         ar1     ar2      ar3      ar4     ar5      ma1      ma2     ma3
      0.2974  0.4783  -0.3763  -0.3246  0.6191  -0.5987  -0.2032  0.7162
s.e.  0.0379  0.0385   0.0358   0.0334  0.0364   0.0375   0.0504  0.0379

sigma^2 = 5895494:  log likelihood = -7369.41
AIC=14756.82   AICc=14757.05   BIC=14798.98
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21"
[10] "2022-04-22" "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30"
[19] "2022-05-01" "2022-05-02" "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09"
[28] "2022-05-10" "2022-05-11" "2022-05-12"

Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 5 row(s) containing missing values (geom_path).

Series: clean[, c("new_cases_smoothed")] 
ARIMA(1,1,1) 

Coefficients:
         ar1      ma1
      0.9563  -0.6208
s.e.  0.0116   0.0271

sigma^2 = 1454757:  log likelihood = -6776.81
AIC=13559.61   AICc=13559.64   BIC=13573.65
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21"
[10] "2022-04-22" "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30"
[19] "2022-05-01" "2022-05-02" "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09"
[28] "2022-05-10" "2022-05-11" "2022-05-12"

Series: clean[, c("new_cases_smoothed")] 
ARIMA(5,1,0) 

Coefficients:
         ar1     ar2     ar3      ar4     ar5
      0.3499  0.1438  0.2316  -0.0871  0.2446
s.e.  0.0343  0.0363  0.0358   0.0364  0.0345

sigma^2 = 5221650:  log likelihood = -7366.44
AIC=14744.88   AICc=14744.99   BIC=14773.03
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21"
[10] "2022-04-22" "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30"
[19] "2022-05-01" "2022-05-02" "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09"
[28] "2022-05-10" "2022-05-11" "2022-05-12"

Warning: Width not defined. Set with `position_dodge(width = ?)`
Warning in max(ids, na.rm = TRUE) :
  no non-missing arguments to max; returning -Inf
Warning: Removed 6 row(s) containing missing values (geom_path).

Series: clean[, c("new_cases_smoothed")] 
ARIMA(5,1,3) 

Coefficients:
         ar1      ar2     ar3      ar4     ar5      ma1     ma2      ma3
      0.2485  -0.4743  0.5743  -0.0617  0.4601  -0.1688  0.7534  -0.2649
s.e.  0.0560   0.0425  0.0477   0.0389  0.0443   0.0589  0.0317   0.0577

sigma^2 = 6749754:  log likelihood = -7468.78
AIC=14955.56   AICc=14955.79   BIC=14997.78
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21" "2022-04-22"
[11] "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30" "2022-05-01" "2022-05-02"
[21] "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09" "2022-05-10" "2022-05-11" "2022-05-12"

Series: clean[, c("new_cases_smoothed")] 
ARIMA(1,2,2) 

Coefficients:
          ar1      ma1      ma2
      -0.3025  -0.0729  -0.3153
s.e.   0.1140   0.1106   0.0455

sigma^2 = 19962:  log likelihood = -5075.33
AIC=10158.65   AICc=10158.7   BIC=10177.38
[1] "2022-04-12"
 [1] "2022-04-13" "2022-04-14" "2022-04-15" "2022-04-16" "2022-04-17" "2022-04-18" "2022-04-19" "2022-04-20" "2022-04-21" "2022-04-22"
[11] "2022-04-23" "2022-04-24" "2022-04-25" "2022-04-26" "2022-04-27" "2022-04-28" "2022-04-29" "2022-04-30" "2022-05-01" "2022-05-02"
[21] "2022-05-03" "2022-05-04" "2022-05-05" "2022-05-06" "2022-05-07" "2022-05-08" "2022-05-09" "2022-05-10" "2022-05-11" "2022-05-12"

LS0tDQp0aXRsZTogIkNPVklELTE5IFZhcmlhbnRzIEFuYWx5c2lzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZ3RhYmxlKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkodnRhYmxlKQ0KbGlicmFyeShyanNvbikNCmxpYnJhcnkodGltZXRrKQ0KbGlicmFyeShSc3NhKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGdnaGlnaGxpZ2h0KQ0KbGlicmFyeSh0c2VyaWVzKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkodHNpYmJsZSkNCiNsaWJyYXJ5KGJyb3Rvb2xzKQ0KDQpgJSFpbiVgIDwtIE5lZ2F0ZShgJWluJWApDQpgYGANCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvdmlkIDwtIHJlYWRfY3N2KCJkYXRhL293aWQtY292aWQtZGF0YS5jc3YiLHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQojdmFyaWFudHMgPC0gcmVhZF9jc3YoImRhdGEvY292aWQtdmFyaWFudHMuY3N2IixzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0KDQpnaXNhaWQgPC0gYXMuZGF0YS5mcmFtZShmcmVhZCgiZGF0YS9naXNhaWRfdmFyaWFudHNfc3RhdGlzdGljcy50c3YiKSkgJT4lIA0KICByZW5hbWUoZGF0ZSA9IGBXZWVrIHByaW9yIHRvYCwNCiAgICAgICAgIGNvdW50ID0gYFN1Ym1pc3Npb24gQ291bnRgLA0KICAgICAgICAgcGVyY19zZXF1ZW5jZXMgPSBgJSBwZXIgQ291bnRyeSBhbmQgV2Vla2AsDQogICAgICAgICB0b3RhbCA9IGBUb3RhbCBwZXIgQ291bnRyeSBhbmQgV2Vla2AsDQogICAgICAgICB2YXJpYW50ID0gVmFsdWUpICU+JSANCiAgbXV0YXRlKGRhdGUgPSB5bWQoZGF0ZSksDQogICAgICAgICBwZXJjX3NlcXVlbmNlcyA9IHJvdW5kKGNvdW50IC8gdG90YWwgKiAxMDAsIDMpKSMgJT4lIA0KIyAgc2VwYXJhdGUodmFyaWFudCwgaW50byA9IGMoInZhcmlhbnQiLCAib3JpZ2luIiksIHNlcCA9IGMoImZpcnN0IGRldGVjdGVkIGluICIpKQ0KDQpnaXNhaWRfdmFyaWFudHMgPC0gZ2lzYWlkICU+JSANCiAgZmlsdGVyKFR5cGUgPT0gIlZhcmlhbnQiKSAlPiUNCiAgc2VwYXJhdGUodmFyaWFudCwgYygidmFyaWFudCIsICJvcmlnaW4iKSwgc2VwID0gImZpcnN0IGRldGVjdGVkIGluICIpICU+JSANCiAgc2VsZWN0KC1UeXBlKQ0KYGBgDQoNCmBgYHtyfQ0KY292aWRfTkFzIDwtIGNvdmlkICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24pICU+JSANCiAgc3VtbWFyaXNlX2FsbChmdW5zKHN1bShpcy5uYSguKSkpKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gLWxvY2F0aW9uLCBuYW1lc190byA9ICJWYXJpYWJsZSIsIHZhbHVlc190byA9ICJOQXMiKSAlPiUgDQogIG11dGF0ZShQZXJjZW50ID0gcm91bmQoTkFzIC8gbnJvdyhjb3ZpZCkgKiAxMDAgLDIpKSAlPiUgDQogIGFycmFuZ2UoLU5BcykNCmBgYA0KDQpgYGB7cn0NCmNvdmlkX05BcyAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9wY3RfbmEgPSBzdW0oUGVyY2VudCkpICU+JSANCiAgYXJyYW5nZSh0b3RhbF9wY3RfbmEpICU+JSANCiAgZGF0YXRhYmxlKGZpbHRlciA9ICd0b3AnKQ0KYGBgDQoNCmBgYHtyfQ0KI0hlbHBlciBmdW5jdGlvbiBmb3IgZmlsdGVyaW5nIGRhdGENCm15X2RhdGEgPC0gZnVuY3Rpb24oY291bnRyeV9jb3ZpZF9maWx0ZXIsIGNvdW50cnlfZ2lzYWlkX2ZpbHRlcil7DQogIGRhdGEgPC0gY292aWQgJT4lIA0KICAgIGZpbHRlcihsb2NhdGlvbiA9PSBjb3VudHJ5X2NvdmlkX2ZpbHRlcikNCiAgZ2lzYWlkX2RhdGEgPC0gZ2lzYWlkX3ZhcmlhbnRzICU+JSANCiAgICBmaWx0ZXIoQ291bnRyeSA9PSBjb3VudHJ5X2dpc2FpZF9maWx0ZXIpDQogIGRhdGEgPC0gbGVmdF9qb2luKGRhdGEsIGdpc2FpZF9kYXRhLCBieSA9ICJkYXRlIikNCiAgZGF0YQ0KfQ0KDQojY292aWQgLSBVbml0ZWQgU3RhdGVzDQojZ2lzYWlkIC0gIlVTQSINCg0KdXMgPC0gbXlfZGF0YSgiVW5pdGVkIFN0YXRlcyIsICJVU0EiKQ0KZnJhbmNlIDwtIG15X2RhdGEoIkZyYW5jZSIsICJGcmFuY2UiKQ0KZ2VybWFueSA8LSBteV9kYXRhKCJHZXJtYW55IiwgIkdlcm1hbnkiKQ0Kc2tvcmVhIDwtIG15X2RhdGEoIlNvdXRoIEtvcmVhIiwgIlNvdXRoIEtvcmVhIikNCmBgYA0KDQpgYGB7ciAiVVMgUGxvdHMifQ0KdmFyaWFudHNfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHVzLCBhZXMoeCA9IGRhdGUpKSArDQogIGdlb21fYXJlYShhZXMoeSA9IHBlcmNfc2VxdWVuY2VzLCBjb2xvciA9IHZhcmlhbnQsIGZpbGwgPSB2YXJpYW50KSwgcG9zaXRpb24gPSAiZG9kZ2UiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCmNhc2VzX3Bsb3QgPC0NCiAgZ2dwbG90KGRhdGEgPSB1cywgYWVzKHggPSBkYXRlKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfY2FzZXNfcGVyX21pbGxpb24pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19kZWF0aHNfcGVyX21pbGxpb24pKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCg0KDQpkZWF0aHNfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHVzLCBhZXMoeCA9IGRhdGUpKSArDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19kZWF0aHNfcGVyX21pbGxpb24pKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCg0KDQp2YWNjaW5hdGlvbnNfcGxvdCA8LSBnZ3Bsb3QodXMsIGFlcyh4ID0gZGF0ZSkpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X3ZhY2NpbmF0aW9uc19zbW9vdGhlZF9wZXJfbWlsbGlvbikpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KdmFyaWFudHNfY2FzZXNfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHVzLCBhZXMoeCA9IGRhdGUpKSArIA0KICBnZW9tX2FyZWEoYWVzKHkgPSBwZXJjX3NlcXVlbmNlcywgY29sb3IgPSB2YXJpYW50LCBmaWxsID0gdmFyaWFudCksIHNob3cubGVnZW5kID1GQUxTRSwgYWxwaGEgPSAwLjUsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X2Nhc2VzX3Ntb290aGVkX3Blcl9taWxsaW9uIC8gNDApKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIlBlcmNlbnQgb2YgU2VxdWVuY2VzIiwgc2VjLmF4aXM9c2VjX2F4aXMofi4qNDAsIG5hbWUgPSAiTmV3IENhc2VzIFBlciBNaWxsaW9uIikpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgQ292aWQgVmFyaWFudHMgdnMgTmV3IENhc2VzIFBlciBNaWxsaW9uIikgICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIwMDcwMSksIHk9NzUsIGxhYmVsPSJBbHBoYS9PdGhlciIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDkwMSksIHk9NzUsIGxhYmVsPSJEZWx0YSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIyMDIwMSksIHk9NzUsIGxhYmVsPSJPbWljcm9uIikNCg0KDQp2YXJpYW50c19kZWF0aHNfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHVzLCBhZXMoeCA9IGRhdGUpKSArIA0KICBnZW9tX2FyZWEoYWVzKHkgPSBwZXJjX3NlcXVlbmNlcywgY29sb3IgPSB2YXJpYW50LCBmaWxsID0gdmFyaWFudCksc2hvdy5sZWdlbmQgPUZBTFNFLCBhbHBoYSA9IDAuNSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfZGVhdGhzX3Ntb290aGVkX3Blcl9taWxsaW9uKjUpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIlBlcmNlbnQgb2YgU2VxdWVuY2VzIiwgc2VjLmF4aXM9c2VjX2F4aXMofi4vNSwgbmFtZSA9ICJOZXcgRGVhdGhzIFBlciBNaWxsaW9uIikpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgQ292aWQgVmFyaWFudHMgdnMgTmV3IERlYXRocyBQZXIgTWlsbGlvbiIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIwMDcwMSksIHk9NzUsIGxhYmVsPSJBbHBoYS9PdGhlciIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDkwMSksIHk9NzUsIGxhYmVsPSJEZWx0YSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIyMDIwMSksIHk9NzUsIGxhYmVsPSJPbWljcm9uIikNCg0KDQpjYXNlc192YWNjaW5hdGlvbnNfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHVzLCBhZXMoeCA9IGRhdGUpKSArDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19jYXNlc19zbW9vdGhlZF9wZXJfbWlsbGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gcGVvcGxlX3ZhY2NpbmF0ZWRfcGVyX2h1bmRyZWQqNTApKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIk5ldyBDYXNlcyBQZXIgTWlsbGlvbiIsIHNlYy5heGlzPXNlY19heGlzKH4uLzUwLCBuYW1lID0gIlBlb3BsZSBWYWNjaW5hdGVkIFBlciBIdW5kcmVkIikpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHRpdGxlID0gIk5ldyBDYXNlcyBQZXIgTWlsbGlvbiB2cy4gUGVvcGxlIFZhY2NpbmF0ZWQgUGVyIEh1bmRyZWQiKQ0KDQpkZWF0aHNfdmFjY2luYXRpb25zX3Bsb3QgPC0gZ2dwbG90KHVzLCBhZXMoeCA9IGRhdGUpKSArDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19kZWF0aHNfcGVyX21pbGxpb24pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fbGluZShhZXMoeSA9IHBlb3BsZV9mdWxseV92YWNjaW5hdGVkX3Blcl9odW5kcmVkLzcpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIk5ldyBEZWF0aHMgUGVyIE1pbGxpb24iLCBzZWMuYXhpcz1zZWNfYXhpcyh+Lio3LCBuYW1lID0gIlBlb3BsZSBWYWNjaW5hdGVkIFBlciBIdW5kcmVkIikpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHRpdGxlID0gIk5ldyBEZWF0aHMgUGVyIE1pbGxpb24gdnMuIFBlb3BsZSBGdWxseSBWYWNjaW5hdGVkIFBlciBIdW5kcmVkIikNCg0KDQp2YXJpYW50c19ob3NwaXRhbGl6YXRpb25zX3Bsb3QgPC0gZ2dwbG90KHVzLCBhZXMoeCA9IGRhdGUpKSArIA0KICBnZW9tX2FyZWEoYWVzKHkgPSBwZXJjX3NlcXVlbmNlcywgY29sb3IgPSB2YXJpYW50LCBmaWxsID0gdmFyaWFudCksIHNob3cubGVnZW5kID1GQUxTRSwgYWxwaGEgPSAwLjUsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gd2Vla2x5X2hvc3BfYWRtaXNzaW9uc19wZXJfbWlsbGlvbiAvIDUpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIlBlcmNlbnQgb2YgU2VxdWVuY2VzIiwgc2VjLmF4aXM9c2VjX2F4aXMofi4qNSwgbmFtZSA9ICJIb3NwaXRhbGl6YXRpb25zIFBlciBNaWxsaW9uIikpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgQ292aWQgVmFyaWFudHMgdnMgSG9zcGl0YWxpemF0aW9ucyBQZXIgTWlsbGlvbiIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIwMDcwMSksIHk9NzUsIGxhYmVsPSJBbHBoYS9PdGhlciIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDkwMSksIHk9NzUsIGxhYmVsPSJEZWx0YSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIyMDIwMSksIHk9NzUsIGxhYmVsPSJPbWljcm9uIikNCg0KdmFyaWFudHNfdmFjY2luYXRpb25zX3Bsb3QgPC0gZ2dwbG90KHVzLCBhZXMoeCA9IGRhdGUpKSArIA0KICBnZW9tX2FyZWEoYWVzKHkgPSBwZXJjX3NlcXVlbmNlcywgY29sb3IgPSB2YXJpYW50LCBmaWxsID0gdmFyaWFudCksIHNob3cubGVnZW5kID1GQUxTRSwgYWxwaGEgPSAwLjUsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gcGVvcGxlX2Z1bGx5X3ZhY2NpbmF0ZWRfcGVyX2h1bmRyZWQpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIlBlcmNlbnQgb2YgU2VxdWVuY2VzIiwgc2VjLmF4aXM9c2VjX2F4aXMofi4sIG5hbWUgPSAiUGVvcGxlIFZhY2NpbmF0ZWQgUGVyIEh1bmRyZWQiKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnModGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBDb3ZpZCBWYXJpYW50cyB2cyBQZW9wbGUgRnVsbHkgVmFjY2luYXRlZCIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIwMDcwMSksIHk9NzUsIGxhYmVsPSJBbHBoYS9PdGhlciIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDkwMSksIHk9NzUsIGxhYmVsPSJEZWx0YSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIyMDIwMSksIHk9NzUsIGxhYmVsPSJPbWljcm9uIikNCmBgYA0KDQpgYGB7cn0NCnZhcmlhbnRzX3ZhY2NpbmF0aW9uc19wbG90DQpgYGANCg0KYGBge3J9DQp2YXJpYW50c19jYXNlc19wbG90IDwtIGdncGxvdChkYXRhID0gdXMsIGFlcyh4ID0gZGF0ZSkpICsgDQogIGdlb21fYXJlYShhZXMoeSA9IHBlcmNfc2VxdWVuY2VzLCBjb2xvciA9IHZhcmlhbnQsIGZpbGwgPSB2YXJpYW50KSwgc2hvdy5sZWdlbmQgPUZBTFNFLCBhbHBoYSA9IDAuNSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfY2FzZXNfc21vb3RoZWRfcGVyX21pbGxpb24gLyA0MCkpICsgDQogIHNjYWxlX3lfY29udGludW91cygiUGVyY2VudCBvZiBTZXF1ZW5jZXMiLCBzZWMuYXhpcz1zZWNfYXhpcyh+Lio0MCwgbmFtZSA9ICJOZXcgQ2FzZXMgUGVyIE1pbGxpb24iKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnModGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBDb3ZpZCBWYXJpYW50cyB2cyBOZXcgQ2FzZXMgUGVyIE1pbGxpb24iKSArDQogIGFubm90YXRlKGdlb209ImxhYmVsIiwgeD15bWQoMjAyMTA1MDEpLCB5PTUwLCBsYWJlbD0iQWxwaGEiKSArDQogIGFubm90YXRlKGdlb209ImxhYmVsIiwgeD15bWQoMjAyMTA5MDEpLCB5PTc1LCBsYWJlbD0iRGVsdGEiKSArDQogIGFubm90YXRlKGdlb209ImxhYmVsIiwgeD15bWQoMjAyMjAyMTUpLCB5PTc1LCBsYWJlbD0iT21pY3JvbiIpDQoNCnZhcmlhbnRzX2Nhc2VzX3Bsb3QNCmBgYA0KDQpgYGB7cn0NCnZhcmlhbnRzX2hvc3BpdGFsaXphdGlvbnNfcGxvdA0KYGBgDQoNCmBgYHtyfQ0KdmFyaWFudHNfZGVhdGhzX3Bsb3QNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoInNmIikNCmxpYnJhcnkoInJuYXR1cmFsZWFydGgiKQ0KbGlicmFyeSgicm5hdHVyYWxlYXJ0aGRhdGEiKQ0KDQp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0KY2xhc3Mod29ybGQpDQpgYGANCg0KYGBge3J9DQp3b3JsZF92YXJpYW50c19kZiA8LSBnaXNhaWRfdmFyaWFudHMgJT4lIA0KICAgIGdyb3VwX2J5KENvdW50cnksKSAlPiUgDQogICAgbXV0YXRlKENvdW50cnkgPSBjYXNlX3doZW4oDQogICAgICBDb3VudHJ5ID09ICJVU0EiIH4gIlVuaXRlZCBTdGF0ZXMiLA0KICAgICAgICAgIFRSVUUgfiBhcy5jaGFyYWN0ZXIoQ291bnRyeSkNCiAgICAgICAgICApKSAlPiUgDQogIHN1bW1hcmlzZShtb3N0X3JlY2VudF9kYXRlID0gZGF0ZVtuKCldLA0KICAgICAgICAgICAgcHJldmFsZW50X3ZhcmlhbnQgPSB2YXJpYW50W2RhdGUgPT0gZGF0ZVtuKCldICYgcGVyY19zZXF1ZW5jZXMgPT0gbWF4KHBlcmNfc2VxdWVuY2VzW2RhdGUgPT0gZGF0ZVtuKCldXSldLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykgJT4lIA0KICBhcnJhbmdlKGRlc2MobW9zdF9yZWNlbnRfZGF0ZSkpICU+JSANCiAgcmVuYW1lKGxvY2F0aW9uID0gQ291bnRyeSkNCg0Kd29ybGRfdmFyaWFudHNfZGYgJT4lIA0KICBhcnJhbmdlKGRlc2MobW9zdF9yZWNlbnRfZGF0ZSkpDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQp3b3JsZF9jYXNlc19wZXJfbWlsX2RmIDwtIGNvdmlkICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKG1vc3RfcmVjZW50X2RhdGUgPSBkYXRlW21heCh3aGljaCghaXMubmEobmV3X2Nhc2VzX3Ntb290aGVkX3Blcl9taWxsaW9uKSkpXSwNCiAgICAgICAgICAgICAgbmV3X2Nhc2VzX3Blcl9taWwgPSBuZXdfY2FzZXNfc21vb3RoZWRfcGVyX21pbGxpb25bbWF4KHdoaWNoKCFpcy5uYShuZXdfY2FzZXNfc21vb3RoZWRfcGVyX21pbGxpb24pKSldKQ0KDQp3b3JsZF9jYXNlc19kZiA8LSBjb3ZpZCAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShtb3N0X3JlY2VudF9kYXRlID0gZGF0ZVttYXgod2hpY2goIWlzLm5hKG5ld19jYXNlc19zbW9vdGhlZCkpKV0sDQogICAgICAgICAgICAgIG5ld19jYXNlcyA9IG5ld19jYXNlc19zbW9vdGhlZFttYXgod2hpY2goIWlzLm5hKG5ld19jYXNlc19zbW9vdGhlZCkpKV0pDQpgYGANCg0KYGBge3J9DQp3b3JsZF92YXJpYW50c19sb2MgPC0gbGVmdF9qb2luKHdvcmxkX3ZhcmlhbnRzX2RmLCBjb3ZpZFssIGMoImxvY2F0aW9uIiwgImlzb19jb2RlIildLCBieSA9ICJsb2NhdGlvbiIsIGFsbC54ID0gVFJVRSwgYWxsLnkgPSBGQUxTRSkgJT4lIA0KICByZW5hbWUoZ3VfYTMgPSBpc29fY29kZSkgJT4lIA0KICB1bmlxdWUoKQ0KDQp3b3JsZF9jYXNlc19wZXJfbWlsX2xvYyA8LSBsZWZ0X2pvaW4od29ybGRfY2FzZXNfcGVyX21pbF9kZiwgY292aWRbLCBjKCJsb2NhdGlvbiIsICJpc29fY29kZSIpXSwgYnkgPSAibG9jYXRpb24iLCBhbGwueCA9IFRSVUUsIGFsbC55ID0gRkFMU0UpICU+JSANCiAgcmVuYW1lKGd1X2EzID0gaXNvX2NvZGUpICU+JSANCiAgdW5pcXVlKCkNCg0Kd29ybGRfY2FzZXNfbG9jIDwtIGxlZnRfam9pbih3b3JsZF9jYXNlc19kZiwgY292aWRbLCBjKCJsb2NhdGlvbiIsICJpc29fY29kZSIpXSwgYnkgPSAibG9jYXRpb24iLCBhbGwueCA9IFRSVUUsIGFsbC55ID0gRkFMU0UpICU+JSANCiAgcmVuYW1lKGd1X2EzID0gaXNvX2NvZGUpICU+JSANCiAgdW5pcXVlKCkNCg0Kd29ybGRfdmFyaWFudHNfbWFwIDwtIGxlZnRfam9pbih3b3JsZCwgd29ybGRfdmFyaWFudHNfbG9jLCBieSA9ICJndV9hMyIsIGFsbC54ID0gVFJVRSkNCg0Kd29ybGRfY2FzZXNfcGVyX21pbF9tYXAgPC0gbGVmdF9qb2luKHdvcmxkLCB3b3JsZF9jYXNlc19wZXJfbWlsX2xvYywgYnkgPSAiZ3VfYTMiLCBhbGwueCA9IFRSVUUpDQoNCndvcmxkX2Nhc2VzX21hcCA8LSBsZWZ0X2pvaW4od29ybGQsIHdvcmxkX2Nhc2VzX2xvYywgYnkgPSAiZ3VfYTMiLCBhbGwueCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQpwIDwtIGdncGxvdChkYXRhID0gd29ybGRfdmFyaWFudHNfbWFwLCBhZXMoZmlsbCA9IHByZXZhbGVudF92YXJpYW50LCB0ZXh0ID0gcGFzdGUwKCJDb3VudHJ5OiAiLCBuYW1lLCAiXG5MYXN0IGRhdGU6ICIsIG1vc3RfcmVjZW50X2RhdGUpKSkgKyANCiAgZ2VvbV9zZigpICsgDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIiIpICsgDQogIGxhYnModGl0bGUgPSAiTW9zdCBQcmV2YWxlbnQgQ292aWQgVmFyaWFudCBieSBDb3VudHJ5IikgKw0KICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gZ3JheSguNSksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAwLjUpLCBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dD0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDEsICJsaW5lIikNCiAgICAgICAgICAgICAgKSANCg0KcA0KYGBgDQoNCmBgYHtyfQ0KDQpgYGANCg0KYGBge3J9DQpwIDwtIGdncGxvdChkYXRhID0gd29ybGRfY2FzZXNfcGVyX21pbF9tYXAsIGFlcyhmaWxsID0gbmV3X2Nhc2VzX3Blcl9taWwsIHRleHQgPSBwYXN0ZTAoIkNvdW50cnk6ICIsIG5hbWUsICJcbkxhc3QgZGF0ZTogIiwgbW9zdF9yZWNlbnRfZGF0ZSkpKSArIA0KICBnZW9tX3NmKCkgKyANCiAgeGxhYigiIikgKyANCiAgeWxhYigiIikgKw0KICBsYWJzKGZpbGwgPSAiTmV3IENhc2VzIFBlciBNaWxsaW9uIikgKyANCiAgbGFicyh0aXRsZSA9ICJOZXcgQ2FzZXMgUGVyIE1pbGxpb24gYnkgQ291bnRyeSIpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9IGdyYXkoLjUpLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMC41KSwgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCANCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMSwgImxpbmUiKQ0KICAgICAgICAgICAgICApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJGIiwgZGlyZWN0aW9uID0gLTEpDQoNCnANCmBgYA0KDQpgYGB7cn0NCnAgPC0gZ2dwbG90KGRhdGEgPSB3b3JsZF9jYXNlc19tYXAsIGFlcyhmaWxsID0gbmV3X2Nhc2VzLCB0ZXh0ID0gcGFzdGUwKCJDb3VudHJ5OiAiLCBuYW1lLCAiXG5MYXN0IGRhdGU6ICIsIG1vc3RfcmVjZW50X2RhdGUpKSkgKyANCiAgZ2VvbV9zZigpICsgDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIiIpICsNCiAgbGFicyhmaWxsID0gIk5ldyBDYXNlcyIpICsgDQogIGxhYnModGl0bGUgPSAiTmV3IENhc2VzIGJ5IENvdW50cnkiKSArDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSBncmF5KC41KSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDAuNSksIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLCAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDEsICJsaW5lIikNCiAgICAgICAgICAgICAgKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAiRiIsIGRpcmVjdGlvbiA9IC0xKQ0KDQpwDQpgYGANCg0KYGBge3J9DQp3b3JsZF9jYXNlc19wZXJfbWlsX2RmICU+JSANCiAgYXJyYW5nZSgtbmV3X2Nhc2VzX3Blcl9taWwpDQpgYGANCg0KYGBge3J9DQp3b3JsZF9jYXNlc19kZiAlPiUgDQogIGZpbHRlcihsb2NhdGlvbiAlIWluJSBjKCJXb3JsZCIsICJIaWdoIGluY29tZSIsICJFdXJvcGUiLCAiRXVyb3BlYW4gVW5pb24iLCAiQXNpYSIsICJVcHBlciBtaWRkbGUgaW5jb21lIiwgIkxvd2VyIG1pZGRsZSBpbmNvbWUiLCAiT2NlYW5pYSIsICJOb3J0aCBBbWVyaWNhIiwgIlNvdXRoIEFtZXJpY2EiKSkgJT4lIA0KICBhcnJhbmdlKC1uZXdfY2FzZXMpDQpgYGANCg0KYGBge3J9DQpjYXNlcyA8LSBjb3ZpZCAlPiUgDQogIGZpbHRlcihsb2NhdGlvbiAlIWluJSBjKCJXb3JsZCIsICJIaWdoIGluY29tZSIsICJFdXJvcGUiLCAiRXVyb3BlYW4gVW5pb24iLCAiQXNpYSIsICJVcHBlciBtaWRkbGUgaW5jb21lIiwgIkxvd2VyIG1pZGRsZSBpbmNvbWUiLCAiT2NlYW5pYSIsICJOb3J0aCBBbWVyaWNhIiwgIlNvdXRoIEFtZXJpY2EiLCAiQWZyaWNhIiwgIkxvdyBpbmNvbWUiKSkgJT4lIA0KICBzZWxlY3QoZGF0ZSwgbG9jYXRpb24sIG5ld19jYXNlc19zbW9vdGhlZCkgJT4lDQogIGRyb3BfbmEoKSAlPiUgDQogIGdsaW1wc2UoKSANCmBgYA0KDQpgYGB7cn0NCnNwcmVhZF9jYXNlcyA8LSBjYXNlcyAlPiUgDQogIHNwcmVhZChsb2NhdGlvbiwgbmV3X2Nhc2VzX3Ntb290aGVkKQ0KYGBgDQoNCmBgYHtyfQ0KY2FzZXNfdCA8LSB0KHNwcmVhZF9jYXNlc1stMV0pDQpjYXNlc19kaXN0IDwtIGRpc3QoY2FzZXNfdCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpDQpmaXQgPC0gaGNsdXN0KGNhc2VzX2Rpc3QsIG1ldGhvZCA9ICJ3YXJkLkQiKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ2RlbmRybykNCmdnZGVuZHJvZ3JhbShmaXQsIHJvdGF0ZSA9IFRSVUUsIHRoZW1lX2RlbmRybyA9IEZBTFNFKSArDQogIHRoZW1lX21pbmltYWwoKSArIHhsYWIoIiIpICsgeWxhYigiIikNCmBgYA0KDQpgYGB7cn0NCmQgPC0gY3V0KGFzLmRlbmRyb2dyYW0oZml0KSwgaCA9IDIwMDAwMDAwKQ0KZA0KYGBgDQoNCmBgYHtyfQ0KY2x1c3RlcmVkX2RhdGEgPC0gY3V0cmVlKGZpdCwgayA9IDUpDQpjbHVzdGVyZWRfZGF0YV90aWR5IDwtIGFzLmRhdGEuZnJhbWUoYXMudGFibGUoY2x1c3RlcmVkX2RhdGEpKSAlPiUgDQogIGdsaW1wc2UoKQ0KY29sbmFtZXMoY2x1c3RlcmVkX2RhdGFfdGlkeSkgPC0gYygibG9jYXRpb24iLCAiY2x1c3RlciIpDQpjbHVzdGVyZWRfZGF0YV90aWR5JGxvY2F0aW9uIDwtIGFzLmNoYXJhY3RlcihjbHVzdGVyZWRfZGF0YV90aWR5JGxvY2F0aW9uKQ0KDQpqb2luZWRfY2x1c3RlcnMgPC0gY2FzZXMgJT4lIA0KICBpbm5lcl9qb2luKGNsdXN0ZXJlZF9kYXRhX3RpZHksIGJ5ID0gImxvY2F0aW9uIikgJT4lIA0KICBnbGltcHNlKCkNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKGNsdXN0ZXJlZF9kYXRhX3RpZHkkY2x1c3RlcikNCmBgYA0KDQpgYGB7cn0NCmpvaW5lZF9jbHVzdGVycyAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShtb3N0X3JlY2VudF9kYXRlID0gZGF0ZVttYXgod2hpY2goIWlzLm5hKG5ld19jYXNlc19zbW9vdGhlZCkpKV0sDQogICAgICAgICAgICBuZXdfY2FzZXMgPSBuZXdfY2FzZXNfc21vb3RoZWRbbWF4KHdoaWNoKCFpcy5uYShuZXdfY2FzZXNfc21vb3RoZWQpKSldLA0KICAgICAgICAgICAgY2x1c3RlciA9IGNsdXN0ZXJbMV0pICU+JSANCiAgbWVyZ2Uod29ybGRfdmFyaWFudHNfZGZbLCBjKCJsb2NhdGlvbiIsICJwcmV2YWxlbnRfdmFyaWFudCIpXSwgYnkgPSAibG9jYXRpb24iKSAlPiUgDQogIGFycmFuZ2UoLW5ld19jYXNlcykNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChqb2luZWRfY2x1c3RlcnMpICsNCiAgZ2VvbV9hcmVhKGFlcyh4ID0gZGF0ZSwgeSA9IG5ld19jYXNlc19zbW9vdGhlZCxmaWxsID0gZmFjdG9yKGNsdXN0ZXIpKSwgYWxwaGEgPSAwLjUsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgbGFicyh0aXRsZSA9ICJOZXcgQ2FzZXMgQnkgQ2x1c3RlciIsIHggPSAiIiwgeSA9ICIiLCBmaWxsID0gIkNsdXN0ZXIiKSANCmBgYA0KDQpgYGB7cn0NCmNsdXN0ZXIxIDwtIGpvaW5lZF9jbHVzdGVycyAlPiUgDQogIGZpbHRlcihjbHVzdGVyID09ICIxIikNCg0KcCA8LSBnZ3Bsb3QoY2x1c3RlcjEsIGFlcyhkYXRlLCBuZXdfY2FzZXNfc21vb3RoZWQpKSArDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBsb2NhdGlvbikpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImF1dG8iLCBjb2xvciA9ICJyZWQiLCBzZSA9IEYsIHNpemUgPSAwLjUpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIyBmYWNldF93cmFwKH5sb2NhdGlvbiwgc2NhbGUgPSAnZnJlZScpIA0KICBsYWJzKHRpdGxlID0gIkNsdXN0ZXIgMSIpDQoNCmdncGxvdGx5KHApDQpgYGANCg0KYGBge3J9DQpjbHVzdGVyMiA8LSBqb2luZWRfY2x1c3RlcnMgJT4lIA0KICBmaWx0ZXIoY2x1c3RlciA9PSAiMiIpDQoNCmdncGxvdChjbHVzdGVyMiwgYWVzKGRhdGUsIG5ld19jYXNlc19zbW9vdGhlZCkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImdyZXkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJhdXRvIiwgY29sb3IgPSAicmVkIiwgc2UgPSBGLCBzaXplID0gMC41KSArDQogIGZhY2V0X3dyYXAofmxvY2F0aW9uLCBzY2FsZXMgPSAnZnJlZScpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICBsYWJzKHRpdGxlID0gIkNsdXN0ZXIgMiIpDQpgYGANCg0KYGBge3J9DQpjbHVzdGVyMyA8LSBqb2luZWRfY2x1c3RlcnMgJT4lIA0KICBmaWx0ZXIoY2x1c3RlciA9PSAiMyIpDQoNCmdncGxvdChjbHVzdGVyMywgYWVzKGRhdGUsIG5ld19jYXNlc19zbW9vdGhlZCkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImdyZXkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJhdXRvIiwgY29sb3IgPSAicmVkIiwgc2UgPSBGLCBzaXplID0gMC41KSArDQogIGZhY2V0X3dyYXAofmxvY2F0aW9uLCBzY2FsZXMgPSAnZnJlZScpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpKyANCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyIDMiKQ0KYGBgDQoNCmBgYHtyfQ0KY2x1c3RlcjQgPC0gam9pbmVkX2NsdXN0ZXJzICU+JSANCiAgZmlsdGVyKGNsdXN0ZXIgPT0gIjQiKQ0KDQpnZ3Bsb3QoY2x1c3RlcjQsIGFlcyhkYXRlLCBuZXdfY2FzZXNfc21vb3RoZWQpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJncmV5IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAiYXV0byIsIGNvbG9yID0gInJlZCIsIHNlID0gRiwgc2l6ZSA9IDAuNSkgKw0KICBmYWNldF93cmFwKH5sb2NhdGlvbiwgc2NhbGUgPSAnZnJlZScpKyANCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyIDQiKQ0KYGBgDQoNCmBgYHtyfQ0KY2x1c3RlcjUgPC0gam9pbmVkX2NsdXN0ZXJzICU+JSANCiAgZmlsdGVyKGNsdXN0ZXIgPT0gIjUiKQ0KDQpnZ3Bsb3QoY2x1c3RlcjUsIGFlcyhkYXRlLCBuZXdfY2FzZXNfc21vb3RoZWQpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJncmV5IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAiYXV0byIsIGNvbG9yID0gInJlZCIsIHNlID0gRiwgc2l6ZSA9IDAuNSkgKw0KICBmYWNldF93cmFwKH5sb2NhdGlvbiwgc2NhbGUgPSAnZnJlZScpKyANCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyIDUiKQ0KYGBgDQoNCmBgYHtyfQ0KI2NsdXN0ZXJlZF9kYXRhX3RpZHkgJT4lIA0KIyAgbXV0YXRlKGxvY2F0aW9uID0gY2FzZV93aGVuKA0KIyAgICBsb2NhdGlvbiA9PSAiVW5pdGVkIFN0YXRlcyIgfiAiVW5pdGVkIFN0YXRlcyINCiMgICkpDQoNCndvcmxkX2NsdXN0ZXJzX2xvYyA8LSBsZWZ0X2pvaW4oY2x1c3RlcmVkX2RhdGFfdGlkeSwgY292aWRbLCBjKCJsb2NhdGlvbiIsICJpc29fY29kZSIpXSwgYnkgPSAibG9jYXRpb24iLCBhbGwueCA9IFRSVUUsIGFsbC55ID0gRkFMU0UpICU+JSANCiAgcmVuYW1lKGd1X2EzID0gaXNvX2NvZGUpICU+JSANCiAgdW5pcXVlKCkNCg0Kd29ybGRfY2x1c3RlcnNfbWFwIDwtIGxlZnRfam9pbih3b3JsZCwgd29ybGRfY2x1c3RlcnNfbG9jLCBieSA9ICJndV9hMyIsIGFsbC54ID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCnAgPC0gZ2dwbG90KGRhdGEgPSB3b3JsZF9jbHVzdGVyc19tYXAsIGFlcyhmaWxsID0gZmFjdG9yKGNsdXN0ZXIpLCB0ZXh0ID0gcGFzdGUwKCJDb3VudHJ5OiAiLCBuYW1lLCAiXG5DbHVzdGVyOiAiLCBjbHVzdGVyKSkpICsgDQogIGdlb21fc2YoKSArIA0KICB4bGFiKCIiKSArIA0KICB5bGFiKCIiKSArDQogIGxhYnMoZmlsbCA9ICJDbHVzdGVycyIpICsgDQogIGxhYnModGl0bGUgPSAiQ291bnRyaWVzIENsdXN0ZXJlZCBieSBDYXNlcyBPdmVyIFRpbWUiKSArDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSBncmF5KC41KSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDAuNSksIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLCAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDEsICJsaW5lIikNCiAgICAgICAgICAgICAgKSArIA0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkFjY2VudCIpDQoNCnANCmBgYA0KDQoNCg0KDQpgYGB7cn0NCiNleHBvcnQgY2FzZXMgd2l0aCBjbHVzdGVycyB0byBjc3YgZm9yIHB5dGhvbiBhbmFseXNpcw0Kd3JpdGUuY3N2KGpvaW5lZF9jbHVzdGVycywgImRhdGFcXGNhc2VzX2NsdXN0ZXJlZC5jc3YiKQ0KYGBgDQoNCiMgQVJJTUEgbW9kZWxpbmcNCg0KYGBge3J9DQojVVNBDQpjbGVhbiA8LSBqb2luZWRfY2x1c3RlcnMgJT4lIA0KICBmaWx0ZXIobG9jYXRpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKSAlPiUgDQogIHNlbGVjdChkYXRlLCBuZXdfY2FzZXNfc21vb3RoZWQpICU+JSANCiAgbXV0YXRlKGRhdGUgPSB5bWQoZGF0ZSkpDQoNCmZpdCA8LSBhdXRvLmFyaW1hKGNsZWFuWyxjKCJuZXdfY2FzZXNfc21vb3RoZWQiKV0pDQpmaXQNCg0KZm9yZWNhc3RlZFZhbHVlcyA8LSBmb3JlY2FzdChmaXQsIDMwKQ0KDQpwcmludChmb3JlY2FzdGVkVmFsdWVzKQ0KDQpjbGVhbiRkYXRlW2xlbmd0aChjbGVhbiRkYXRlKV0NCg0KY2xlYW4gJT4lIA0KICBtdXRhdGUobnVtID0gc2VxKDEsbGVuZ3RoKGNsZWFuJGRhdGUpKSkNCg0Kc2VxKGNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXSArIDEsIGJ5ID0gImRheXMiLCBsZW5ndGgub3V0ID0gMzApDQoNCmZvcmVjYXN0IDwtIGRhdGEuZnJhbWUoZGF0ZSA9IHNlcShjbGVhbiRkYXRlW2xlbmd0aChjbGVhbiRkYXRlKV0gKyAxLCBieSA9ICJkYXlzIiwgbGVuZ3RoLm91dCA9IDMwKSwgDQogICAgICAgICAgIHByZWQgPSBmb3JlY2FzdGVkVmFsdWVzJG1lYW4sIA0KICAgICAgICAgICBMbzk1ID0gZm9yZWNhc3RlZFZhbHVlcyRsb3dlclssMl0sDQogICAgICAgICAgIEhpOTUgPSBmb3JlY2FzdGVkVmFsdWVzJHVwcGVyWywyXSkNCg0KI3Bsb3QoZm9yZWNhc3RlZFZhbHVlcykNCg0KY2xlYW4gJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X2Nhc2VzX3Ntb290aGVkLCB4ID0gZGF0ZSksIGNvbG91ciA9ICJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IGZvcmVjYXN0LCBhZXMoeCA9IGRhdGUsIHltaW4gPSBMbzk1LCB5bWF4ID0gSGk5NSksIGZpbGwgPSAiZ3JheSIsIGFscGhhID0gMC41KSArDQogIGdlb21fbGluZShkYXRhID0gZm9yZWNhc3QsIGFlcyh4ID0gZGF0ZSwgeSA9IHByZWQpLCBsaW5ldHlwZSA9IDIsIGNvbG91ciA9ICJyZWQiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnModGl0bGUgPSAiVW5pdGVkIFN0YXRlcyAzMCBEYXkgRm9yZWNhc3Qgb2YgTmV3IENhc2VzIiwgeCA9ICIiLCB5ID0gIiIpDQoNCmdncGxvdChkYXRhID0gdXMsIGFlcyh4ID0gZGF0ZSkpICsgDQogIGdlb21fYXJlYShhZXMoeSA9IHBlcmNfc2VxdWVuY2VzLCBjb2xvciA9IHZhcmlhbnQsIGZpbGwgPSB2YXJpYW50KSwgc2hvdy5sZWdlbmQgPUZBTFNFLCBhbHBoYSA9IDAuNSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfY2FzZXNfc21vb3RoZWRfcGVyX21pbGxpb24gLyA0MCkpICsgDQogIHNjYWxlX3lfY29udGludW91cygiUGVyY2VudCBvZiBTZXF1ZW5jZXMiLCBzZWMuYXhpcz1zZWNfYXhpcyh+Lio0MCwgbmFtZSA9ICJOZXcgQ2FzZXMgUGVyIE1pbGxpb24iKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnModGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBDb3ZpZCBWYXJpYW50cyB2cyBOZXcgQ2FzZXMgUGVyIE1pbGxpb24iKSAgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjEwNTAxKSwgeT01MCwgbGFiZWw9IkFscGhhIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjEwOTAxKSwgeT03NSwgbGFiZWw9IkRlbHRhIikgKw0KICBhbm5vdGF0ZShnZW9tPSJsYWJlbCIsIHg9eW1kKDIwMjIwMjE1KSwgeT03NSwgbGFiZWw9Ik9taWNyb24iKQ0KYGBgDQoNCmBgYHtyfQ0KI0F1c3RyaWENCmNsZWFuIDwtIGpvaW5lZF9jbHVzdGVycyAlPiUgDQogIGZpbHRlcihsb2NhdGlvbiA9PSAiQXVzdHJpYSIpICU+JSANCiAgc2VsZWN0KGRhdGUsIG5ld19jYXNlc19zbW9vdGhlZCkgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHltZChkYXRlKSkNCg0KZml0IDwtIGF1dG8uYXJpbWEoY2xlYW5bLGMoIm5ld19jYXNlc19zbW9vdGhlZCIpXSkNCmZpdA0KDQpmb3JlY2FzdGVkVmFsdWVzIDwtIGZvcmVjYXN0KGZpdCwgMzApDQoNCnByaW50KGZvcmVjYXN0ZWRWYWx1ZXMpDQoNCmNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXQ0KDQpjbGVhbiAlPiUgDQogIG11dGF0ZShudW0gPSBzZXEoMSxsZW5ndGgoY2xlYW4kZGF0ZSkpKQ0KDQpzZXEoY2xlYW4kZGF0ZVtsZW5ndGgoY2xlYW4kZGF0ZSldICsgMSwgYnkgPSAiZGF5cyIsIGxlbmd0aC5vdXQgPSAzMCkNCg0KZm9yZWNhc3QgPC0gZGF0YS5mcmFtZShkYXRlID0gc2VxKGNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXSArIDEsIGJ5ID0gImRheXMiLCBsZW5ndGgub3V0ID0gMzApLCANCiAgICAgICAgICAgcHJlZCA9IGZvcmVjYXN0ZWRWYWx1ZXMkbWVhbiwgDQogICAgICAgICAgIExvOTUgPSBmb3JlY2FzdGVkVmFsdWVzJGxvd2VyWywyXSwNCiAgICAgICAgICAgSGk5NSA9IGZvcmVjYXN0ZWRWYWx1ZXMkdXBwZXJbLDJdKQ0KDQojcGxvdChmb3JlY2FzdGVkVmFsdWVzKQ0KDQpjbGVhbiAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfY2FzZXNfc21vb3RoZWQsIHggPSBkYXRlKSwgY29sb3VyID0gImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gZm9yZWNhc3QsIGFlcyh4ID0gZGF0ZSwgeW1pbiA9IExvOTUsIHltYXggPSBIaTk1KSwgZmlsbCA9ICJncmF5IiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBmb3JlY2FzdCwgYWVzKHggPSBkYXRlLCB5ID0gcHJlZCksIGxpbmV0eXBlID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh0aXRsZSA9ICJBdXN0cmlhIDMwIERheSBGb3JlY2FzdCBvZiBOZXcgQ2FzZXMiLCB4ID0gIiIsIHkgPSAiIikNCmBgYA0KDQpgYGB7cn0NCiNJbmRpYQ0KY2xlYW4gPC0gam9pbmVkX2NsdXN0ZXJzICU+JSANCiAgZmlsdGVyKGxvY2F0aW9uID09ICJJbmRpYSIpICU+JSANCiAgc2VsZWN0KGRhdGUsIG5ld19jYXNlc19zbW9vdGhlZCkgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHltZChkYXRlKSkNCg0KZml0IDwtIGF1dG8uYXJpbWEoY2xlYW5bLGMoIm5ld19jYXNlc19zbW9vdGhlZCIpXSkNCmZpdA0KDQpmb3JlY2FzdGVkVmFsdWVzIDwtIGZvcmVjYXN0KGZpdCwgMzApDQoNCnByaW50KGZvcmVjYXN0ZWRWYWx1ZXMpDQoNCmNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXQ0KDQpjbGVhbiAlPiUgDQogIG11dGF0ZShudW0gPSBzZXEoMSxsZW5ndGgoY2xlYW4kZGF0ZSkpKQ0KDQpzZXEoY2xlYW4kZGF0ZVtsZW5ndGgoY2xlYW4kZGF0ZSldICsgMSwgYnkgPSAiZGF5cyIsIGxlbmd0aC5vdXQgPSAzMCkNCg0KZm9yZWNhc3QgPC0gZGF0YS5mcmFtZShkYXRlID0gc2VxKGNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXSArIDEsIGJ5ID0gImRheXMiLCBsZW5ndGgub3V0ID0gMzApLCANCiAgICAgICAgICAgcHJlZCA9IGZvcmVjYXN0ZWRWYWx1ZXMkbWVhbiwgDQogICAgICAgICAgIExvOTUgPSBmb3JlY2FzdGVkVmFsdWVzJGxvd2VyWywyXSwNCiAgICAgICAgICAgSGk5NSA9IGZvcmVjYXN0ZWRWYWx1ZXMkdXBwZXJbLDJdKQ0KDQojcGxvdChmb3JlY2FzdGVkVmFsdWVzKQ0KDQpjbGVhbiAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfY2FzZXNfc21vb3RoZWQsIHggPSBkYXRlKSwgY29sb3VyID0gImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gZm9yZWNhc3QsIGFlcyh4ID0gZGF0ZSwgeW1pbiA9IExvOTUsIHltYXggPSBIaTk1KSwgZmlsbCA9ICJncmF5IiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBmb3JlY2FzdCwgYWVzKHggPSBkYXRlLCB5ID0gcHJlZCksIGxpbmV0eXBlID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh0aXRsZSA9ICJJbmRpYSAzMCBEYXkgRm9yZWNhc3Qgb2YgTmV3IENhc2VzIiwgeCA9ICIiLCB5ID0gIiIpDQpgYGANCg0KYGBge3J9DQojRnJhbmNlDQpjbGVhbiA8LSBqb2luZWRfY2x1c3RlcnMgJT4lIA0KICBmaWx0ZXIobG9jYXRpb24gPT0gIkZyYW5jZSIpICU+JSANCiAgc2VsZWN0KGRhdGUsIG5ld19jYXNlc19zbW9vdGhlZCkgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHltZChkYXRlKSkNCg0KZml0IDwtIGF1dG8uYXJpbWEoY2xlYW5bLGMoIm5ld19jYXNlc19zbW9vdGhlZCIpXSkNCmZpdA0KDQpmb3JlY2FzdGVkVmFsdWVzIDwtIGZvcmVjYXN0KGZpdCwgMzApDQoNCnByaW50KGZvcmVjYXN0ZWRWYWx1ZXMpDQoNCmNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXQ0KDQpjbGVhbiAlPiUgDQogIG11dGF0ZShudW0gPSBzZXEoMSxsZW5ndGgoY2xlYW4kZGF0ZSkpKQ0KDQpzZXEoY2xlYW4kZGF0ZVtsZW5ndGgoY2xlYW4kZGF0ZSldICsgMSwgYnkgPSAiZGF5cyIsIGxlbmd0aC5vdXQgPSAzMCkNCg0KZm9yZWNhc3QgPC0gZGF0YS5mcmFtZShkYXRlID0gc2VxKGNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXSArIDEsIGJ5ID0gImRheXMiLCBsZW5ndGgub3V0ID0gMzApLCANCiAgICAgICAgICAgcHJlZCA9IGZvcmVjYXN0ZWRWYWx1ZXMkbWVhbiwgDQogICAgICAgICAgIExvOTUgPSBmb3JlY2FzdGVkVmFsdWVzJGxvd2VyWywyXSwNCiAgICAgICAgICAgSGk5NSA9IGZvcmVjYXN0ZWRWYWx1ZXMkdXBwZXJbLDJdKQ0KDQojcGxvdChmb3JlY2FzdGVkVmFsdWVzKQ0KDQpjbGVhbiAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfY2FzZXNfc21vb3RoZWQsIHggPSBkYXRlKSwgY29sb3VyID0gImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gZm9yZWNhc3QsIGFlcyh4ID0gZGF0ZSwgeW1pbiA9IExvOTUsIHltYXggPSBIaTk1KSwgZmlsbCA9ICJncmF5IiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBmb3JlY2FzdCwgYWVzKHggPSBkYXRlLCB5ID0gcHJlZCksIGxpbmV0eXBlID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh0aXRsZSA9ICJGcmFuY2UgMzAgRGF5IEZvcmVjYXN0IG9mIE5ldyBDYXNlcyIsIHggPSAiIiwgeSA9ICIiKQ0KDQpnZ3Bsb3QoZGF0YSA9IGZyYW5jZSwgYWVzKHggPSBkYXRlKSkgKyANCiAgZ2VvbV9hcmVhKGFlcyh5ID0gcGVyY19zZXF1ZW5jZXMsIGNvbG9yID0gdmFyaWFudCwgZmlsbCA9IHZhcmlhbnQpLCBzaG93LmxlZ2VuZCA9RkFMU0UsIGFscGhhID0gMC41LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19jYXNlc19zbW9vdGhlZF9wZXJfbWlsbGlvbi8gNjApKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIlBlcmNlbnQgb2YgU2VxdWVuY2VzIiwgc2VjLmF4aXM9c2VjX2F4aXMofi4qNjAsIG5hbWUgPSAiTmV3IENhc2VzIFBlciBNaWxsaW9uIikpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgQ292aWQgVmFyaWFudHMgdnMgTmV3IENhc2VzIFBlciBNaWxsaW9uIikgICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDUwMSksIHk9NTAsIGxhYmVsPSJBbHBoYSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDkwMSksIHk9NzUsIGxhYmVsPSJEZWx0YSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIyMDIxNSksIHk9NzUsIGxhYmVsPSJPbWljcm9uIikNCmBgYA0KDQpgYGB7cn0NCiNHZXJtYW55DQpjbGVhbiA8LSBqb2luZWRfY2x1c3RlcnMgJT4lIA0KICBmaWx0ZXIobG9jYXRpb24gPT0gIkdlcm1hbnkiKSAlPiUgDQogIHNlbGVjdChkYXRlLCBuZXdfY2FzZXNfc21vb3RoZWQpICU+JSANCiAgbXV0YXRlKGRhdGUgPSB5bWQoZGF0ZSkpDQoNCmZpdCA8LSBhdXRvLmFyaW1hKGNsZWFuWyxjKCJuZXdfY2FzZXNfc21vb3RoZWQiKV0pDQpmaXQNCg0KZm9yZWNhc3RlZFZhbHVlcyA8LSBmb3JlY2FzdChmaXQsIDMwKQ0KDQpwcmludChmb3JlY2FzdGVkVmFsdWVzKQ0KDQpjbGVhbiRkYXRlW2xlbmd0aChjbGVhbiRkYXRlKV0NCg0KY2xlYW4gJT4lIA0KICBtdXRhdGUobnVtID0gc2VxKDEsbGVuZ3RoKGNsZWFuJGRhdGUpKSkNCg0Kc2VxKGNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXSArIDEsIGJ5ID0gImRheXMiLCBsZW5ndGgub3V0ID0gMzApDQoNCmZvcmVjYXN0IDwtIGRhdGEuZnJhbWUoZGF0ZSA9IHNlcShjbGVhbiRkYXRlW2xlbmd0aChjbGVhbiRkYXRlKV0gKyAxLCBieSA9ICJkYXlzIiwgbGVuZ3RoLm91dCA9IDMwKSwgDQogICAgICAgICAgIHByZWQgPSBmb3JlY2FzdGVkVmFsdWVzJG1lYW4sIA0KICAgICAgICAgICBMbzk1ID0gZm9yZWNhc3RlZFZhbHVlcyRsb3dlclssMl0sDQogICAgICAgICAgIEhpOTUgPSBmb3JlY2FzdGVkVmFsdWVzJHVwcGVyWywyXSkNCg0KI3Bsb3QoZm9yZWNhc3RlZFZhbHVlcykNCg0KY2xlYW4gJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X2Nhc2VzX3Ntb290aGVkLCB4ID0gZGF0ZSksIGNvbG91ciA9ICJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IGZvcmVjYXN0LCBhZXMoeCA9IGRhdGUsIHltaW4gPSBMbzk1LCB5bWF4ID0gSGk5NSksIGZpbGwgPSAiZ3JheSIsIGFscGhhID0gMC41KSArDQogIGdlb21fbGluZShkYXRhID0gZm9yZWNhc3QsIGFlcyh4ID0gZGF0ZSwgeSA9IHByZWQpLCBsaW5ldHlwZSA9IDIsIGNvbG91ciA9ICJyZWQiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnModGl0bGUgPSAiR2VybWFueSAzMCBEYXkgRm9yZWNhc3Qgb2YgTmV3IENhc2VzIiwgeCA9ICIiLCB5ID0gIiIpDQoNCmdncGxvdChkYXRhID0gZ2VybWFueSwgYWVzKHggPSBkYXRlKSkgKyANCiAgZ2VvbV9hcmVhKGFlcyh5ID0gcGVyY19zZXF1ZW5jZXMsIGNvbG9yID0gdmFyaWFudCwgZmlsbCA9IHZhcmlhbnQpLCBzaG93LmxlZ2VuZCA9RkFMU0UsIGFscGhhID0gMC41LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19jYXNlc19zbW9vdGhlZF9wZXJfbWlsbGlvbi8gNTApKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIlBlcmNlbnQgb2YgU2VxdWVuY2VzIiwgc2VjLmF4aXM9c2VjX2F4aXMofi4qNTAsIG5hbWUgPSAiTmV3IENhc2VzIFBlciBNaWxsaW9uIikpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgQ292aWQgVmFyaWFudHMgdnMgTmV3IENhc2VzIFBlciBNaWxsaW9uIikgICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDUwMSksIHk9NzUsIGxhYmVsPSJBbHBoYSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIxMDkwMSksIHk9NzUsIGxhYmVsPSJEZWx0YSIpICsNCiAgYW5ub3RhdGUoZ2VvbT0ibGFiZWwiLCB4PXltZCgyMDIyMDIxNSksIHk9NzUsIGxhYmVsPSJPbWljcm9uIikNCmBgYA0KDQpgYGB7cn0NCiNJdGFseQ0KY2xlYW4gPC0gam9pbmVkX2NsdXN0ZXJzICU+JSANCiAgZmlsdGVyKGxvY2F0aW9uID09ICJJdGFseSIpICU+JSANCiAgc2VsZWN0KGRhdGUsIG5ld19jYXNlc19zbW9vdGhlZCkgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHltZChkYXRlKSkNCg0KZml0IDwtIGF1dG8uYXJpbWEoY2xlYW5bLGMoIm5ld19jYXNlc19zbW9vdGhlZCIpXSkNCmZpdA0KDQpmb3JlY2FzdGVkVmFsdWVzIDwtIGZvcmVjYXN0KGZpdCwgMzApDQoNCnByaW50KGZvcmVjYXN0ZWRWYWx1ZXMpDQoNCmNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXQ0KDQpjbGVhbiAlPiUgDQogIG11dGF0ZShudW0gPSBzZXEoMSxsZW5ndGgoY2xlYW4kZGF0ZSkpKQ0KDQpzZXEoY2xlYW4kZGF0ZVtsZW5ndGgoY2xlYW4kZGF0ZSldICsgMSwgYnkgPSAiZGF5cyIsIGxlbmd0aC5vdXQgPSAzMCkNCg0KZm9yZWNhc3QgPC0gZGF0YS5mcmFtZShkYXRlID0gc2VxKGNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXSArIDEsIGJ5ID0gImRheXMiLCBsZW5ndGgub3V0ID0gMzApLCANCiAgICAgICAgICAgcHJlZCA9IGZvcmVjYXN0ZWRWYWx1ZXMkbWVhbiwgDQogICAgICAgICAgIExvOTUgPSBmb3JlY2FzdGVkVmFsdWVzJGxvd2VyWywyXSwNCiAgICAgICAgICAgSGk5NSA9IGZvcmVjYXN0ZWRWYWx1ZXMkdXBwZXJbLDJdKQ0KDQojcGxvdChmb3JlY2FzdGVkVmFsdWVzKQ0KDQpjbGVhbiAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBuZXdfY2FzZXNfc21vb3RoZWQsIHggPSBkYXRlKSwgY29sb3VyID0gImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gZm9yZWNhc3QsIGFlcyh4ID0gZGF0ZSwgeW1pbiA9IExvOTUsIHltYXggPSBIaTk1KSwgZmlsbCA9ICJncmF5IiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBmb3JlY2FzdCwgYWVzKHggPSBkYXRlLCB5ID0gcHJlZCksIGxpbmV0eXBlID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh0aXRsZSA9ICJJdGFseSAzMCBEYXkgRm9yZWNhc3Qgb2YgTmV3IENhc2VzIiwgeCA9ICIiLCB5ID0gIiIpDQpgYGANCg0KYGBge3J9DQojU291dGggS29yZWENCmNsZWFuIDwtIGpvaW5lZF9jbHVzdGVycyAlPiUgDQogIGZpbHRlcihsb2NhdGlvbiA9PSAiU291dGggS29yZWEiKSAlPiUgDQogIHNlbGVjdChkYXRlLCBuZXdfY2FzZXNfc21vb3RoZWQpICU+JSANCiAgbXV0YXRlKGRhdGUgPSB5bWQoZGF0ZSkpDQoNCmZpdCA8LSBhdXRvLmFyaW1hKGNsZWFuWyxjKCJuZXdfY2FzZXNfc21vb3RoZWQiKV0pDQpmaXQNCg0KZm9yZWNhc3RlZFZhbHVlcyA8LSBmb3JlY2FzdChmaXQsIDMwKQ0KDQpwcmludChmb3JlY2FzdGVkVmFsdWVzKQ0KDQpjbGVhbiRkYXRlW2xlbmd0aChjbGVhbiRkYXRlKV0NCg0KY2xlYW4gJT4lIA0KICBtdXRhdGUobnVtID0gc2VxKDEsbGVuZ3RoKGNsZWFuJGRhdGUpKSkNCg0Kc2VxKGNsZWFuJGRhdGVbbGVuZ3RoKGNsZWFuJGRhdGUpXSArIDEsIGJ5ID0gImRheXMiLCBsZW5ndGgub3V0ID0gMzApDQoNCmZvcmVjYXN0IDwtIGRhdGEuZnJhbWUoZGF0ZSA9IHNlcShjbGVhbiRkYXRlW2xlbmd0aChjbGVhbiRkYXRlKV0gKyAxLCBieSA9ICJkYXlzIiwgbGVuZ3RoLm91dCA9IDMwKSwgDQogICAgICAgICAgIHByZWQgPSBmb3JlY2FzdGVkVmFsdWVzJG1lYW4sIA0KICAgICAgICAgICBMbzk1ID0gZm9yZWNhc3RlZFZhbHVlcyRsb3dlclssMl0sDQogICAgICAgICAgIEhpOTUgPSBmb3JlY2FzdGVkVmFsdWVzJHVwcGVyWywyXSkNCg0KI3Bsb3QoZm9yZWNhc3RlZFZhbHVlcykNCg0KY2xlYW4gJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbmV3X2Nhc2VzX3Ntb290aGVkLCB4ID0gZGF0ZSksIGNvbG91ciA9ICJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IGZvcmVjYXN0LCBhZXMoeCA9IGRhdGUsIHltaW4gPSBMbzk1LCB5bWF4ID0gSGk5NSksIGZpbGwgPSAiZ3JheSIsIGFscGhhID0gMC41KSArDQogIGdlb21fbGluZShkYXRhID0gZm9yZWNhc3QsIGFlcyh4ID0gZGF0ZSwgeSA9IHByZWQpLCBsaW5ldHlwZSA9IDIsIGNvbG91ciA9ICJyZWQiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnModGl0bGUgPSAiU291dGggS29yZWEgMzAgRGF5IEZvcmVjYXN0IG9mIE5ldyBDYXNlcyIsIHggPSAiIiwgeSA9ICIiKQ0KDQpnZ3Bsb3QoZGF0YSA9IHNrb3JlYSwgYWVzKHggPSBkYXRlKSkgKyANCiAgZ2VvbV9hcmVhKGFlcyh5ID0gcGVyY19zZXF1ZW5jZXMsIGNvbG9yID0gdmFyaWFudCwgZmlsbCA9IHZhcmlhbnQpLCBzaG93LmxlZ2VuZCA9RkFMU0UsIGFscGhhID0gMC41LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19jYXNlc19zbW9vdGhlZF9wZXJfbWlsbGlvbi8gODApKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoIlBlcmNlbnQgb2YgU2VxdWVuY2VzIiwgc2VjLmF4aXM9c2VjX2F4aXMofi4qODAsIG5hbWUgPSAiTmV3IENhc2VzIFBlciBNaWxsaW9uIikpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgQ292aWQgVmFyaWFudHMgdnMgTmV3IENhc2VzIFBlciBNaWxsaW9uIikgICsNCiAgI2Fubm90YXRlKGdlb209ImxhYmVsIiwgeD15bWQoMjAyMTA1MDEpLCB5PTc1LCBsYWJlbD0iQWxwaGEiKSArDQogIGFubm90YXRlKGdlb209ImxhYmVsIiwgeD15bWQoMjAyMTEwMDEpLCB5PTc1LCBsYWJlbD0iRGVsdGEiKSArDQogIGFubm90YXRlKGdlb209ImxhYmVsIiwgeD15bWQoMjAyMjAyMTUpLCB5PTc1LCBsYWJlbD0iT21pY3JvbiIpDQpgYGANCg0KYGBge3J9DQojVmlldG5hbQ0KY2xlYW4gPC0gam9pbmVkX2NsdXN0ZXJzICU+JSANCiAgZmlsdGVyKGxvY2F0aW9uID09ICJWaWV0bmFtIikgJT4lIA0KICBzZWxlY3QoZGF0ZSwgbmV3X2Nhc2VzX3Ntb290aGVkKSAlPiUgDQogIG11dGF0ZShkYXRlID0geW1kKGRhdGUpKQ0KDQpmaXQgPC0gYXV0by5hcmltYShjbGVhblssYygibmV3X2Nhc2VzX3Ntb290aGVkIildKQ0KZml0DQoNCmZvcmVjYXN0ZWRWYWx1ZXMgPC0gZm9yZWNhc3QoZml0LCAzMCkNCg0KcHJpbnQoZm9yZWNhc3RlZFZhbHVlcykNCg0KY2xlYW4kZGF0ZVtsZW5ndGgoY2xlYW4kZGF0ZSldDQoNCmNsZWFuICU+JSANCiAgbXV0YXRlKG51bSA9IHNlcSgxLGxlbmd0aChjbGVhbiRkYXRlKSkpDQoNCnNlcShjbGVhbiRkYXRlW2xlbmd0aChjbGVhbiRkYXRlKV0gKyAxLCBieSA9ICJkYXlzIiwgbGVuZ3RoLm91dCA9IDMwKQ0KDQpmb3JlY2FzdCA8LSBkYXRhLmZyYW1lKGRhdGUgPSBzZXEoY2xlYW4kZGF0ZVtsZW5ndGgoY2xlYW4kZGF0ZSldICsgMSwgYnkgPSAiZGF5cyIsIGxlbmd0aC5vdXQgPSAzMCksIA0KICAgICAgICAgICBwcmVkID0gZm9yZWNhc3RlZFZhbHVlcyRtZWFuLCANCiAgICAgICAgICAgTG85NSA9IGZvcmVjYXN0ZWRWYWx1ZXMkbG93ZXJbLDJdLA0KICAgICAgICAgICBIaTk1ID0gZm9yZWNhc3RlZFZhbHVlcyR1cHBlclssMl0pDQoNCiNwbG90KGZvcmVjYXN0ZWRWYWx1ZXMpDQoNCmNsZWFuICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19jYXNlc19zbW9vdGhlZCwgeCA9IGRhdGUpLCBjb2xvdXIgPSAiYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBmb3JlY2FzdCwgYWVzKHggPSBkYXRlLCB5bWluID0gTG85NSwgeW1heCA9IEhpOTUpLCBmaWxsID0gImdyYXkiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGZvcmVjYXN0LCBhZXMoeCA9IGRhdGUsIHkgPSBwcmVkKSwgbGluZXR5cGUgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHRpdGxlID0gIlZpZXRuYW0gMzAgRGF5IEZvcmVjYXN0IG9mIE5ldyBDYXNlcyIsIHggPSAiIiwgeSA9ICIiKQ0KYGBgDQoNCmBgYHtyfQ0KI0NoaW5hDQpjbGVhbiA8LSBqb2luZWRfY2x1c3RlcnMgJT4lIA0KICBmaWx0ZXIobG9jYXRpb24gPT0gIkNoaW5hIikgJT4lIA0KICBzZWxlY3QoZGF0ZSwgbmV3X2Nhc2VzX3Ntb290aGVkKSAlPiUgDQogIG11dGF0ZShkYXRlID0geW1kKGRhdGUpKQ0KDQpmaXQgPC0gYXV0by5hcmltYShjbGVhblssYygibmV3X2Nhc2VzX3Ntb290aGVkIildKQ0KZml0DQoNCmZvcmVjYXN0ZWRWYWx1ZXMgPC0gZm9yZWNhc3QoZml0LCAzMCkNCg0KcHJpbnQoZm9yZWNhc3RlZFZhbHVlcykNCg0KY2xlYW4kZGF0ZVtsZW5ndGgoY2xlYW4kZGF0ZSldDQoNCmNsZWFuICU+JSANCiAgbXV0YXRlKG51bSA9IHNlcSgxLGxlbmd0aChjbGVhbiRkYXRlKSkpDQoNCnNlcShjbGVhbiRkYXRlW2xlbmd0aChjbGVhbiRkYXRlKV0gKyAxLCBieSA9ICJkYXlzIiwgbGVuZ3RoLm91dCA9IDMwKQ0KDQpmb3JlY2FzdCA8LSBkYXRhLmZyYW1lKGRhdGUgPSBzZXEoY2xlYW4kZGF0ZVtsZW5ndGgoY2xlYW4kZGF0ZSldICsgMSwgYnkgPSAiZGF5cyIsIGxlbmd0aC5vdXQgPSAzMCksIA0KICAgICAgICAgICBwcmVkID0gZm9yZWNhc3RlZFZhbHVlcyRtZWFuLCANCiAgICAgICAgICAgTG85NSA9IGZvcmVjYXN0ZWRWYWx1ZXMkbG93ZXJbLDJdLA0KICAgICAgICAgICBIaTk1ID0gZm9yZWNhc3RlZFZhbHVlcyR1cHBlclssMl0pDQoNCiNwbG90KGZvcmVjYXN0ZWRWYWx1ZXMpDQoNCmNsZWFuICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fbGluZShhZXMoeSA9IG5ld19jYXNlc19zbW9vdGhlZCwgeCA9IGRhdGUpLCBjb2xvdXIgPSAiYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBmb3JlY2FzdCwgYWVzKHggPSBkYXRlLCB5bWluID0gTG85NSwgeW1heCA9IEhpOTUpLCBmaWxsID0gImdyYXkiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGZvcmVjYXN0LCBhZXMoeCA9IGRhdGUsIHkgPSBwcmVkKSwgbGluZXR5cGUgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHRpdGxlID0gIkNoaW5hIDMwIERheSBGb3JlY2FzdCBvZiBOZXcgQ2FzZXMiLCB4ID0gIiIsIHkgPSAiIikNCmBgYA0K